library(psych)
library(corrplot)
library(dplyr)
library(tidyverse)
library(stringr)
library(base)
library(sf)
library(scales)
library(vars)
library(lattice)
library(urca)
library(ggplot2)
library(MASS)
library(haven)
library(joineR)
Loading required package: survival
library(pROC)
Type 'citation("pROC")' for a citation.

Attaching package: ‘pROC’

The following objects are masked from ‘package:stats’:

    cov, smooth, var
library(MESS)

Attaching package: ‘MESS’

The following object is masked from ‘package:pROC’:

    auc
library(arules)
Loading required package: Matrix

Attaching package: ‘Matrix’

The following objects are masked from ‘package:tidyr’:

    expand, pack, unpack


Attaching package: ‘arules’

The following object is masked from ‘package:dplyr’:

    recode

The following objects are masked from ‘package:base’:

    abbreviate, write

read file

data=read.csv('new_data.csv')

Data exploration

There are 12 variables in the data with 485 observations. Including 1 date variable, 2 response variables, and 9 predictors. All variables are numeric type except variale ‘date’. 1. date 2. new_cases: the daily new confirmed COVID cases in Netherlands 3. new_deaths: the daily new deaths of COVID patients in Netherlands 4. ICU_patients: the COVID patients admitted to ICU per day in hospital 5. Hosp_patients: the COVID patients admitted to hosptial per day 6. stringency_index: 7. temp: daily temperature 8. humidity: daily humidity 9. precip: the amount of rains per day 10. windspeed: daily windspeed 11. transit_stations: 12: residential:

问题: transit 都是负数,需不需要调整从0开始 判断人们乘坐交通的变化

checking missingness

sum(is.na(data$hosp_patients))
[1] 9

There are 18 missing values in the data, locate in ICU patients and Hospital patients columns. (The government website does not have COVID records for some days during 2021- 2022)

correlations

For hospital admission 1.hospital admission and humidity, hospital admission and precipitation have small correlation less than 0.1 2.hospital admission and new deaths, hospital admission and resident are highly positive correlated 3.hospital admission and temperature, hospital admission and transit are highly negative correlated

for hospital admission: fit var model including all variables, comparing to the var model without humidity, precipitation, and wind speed.

For ICU admission 1.ICU admission and humidity, ICU admission and precipitation, ICU and wind speed have small correlation less than 0.1. 2.ICU admission and new deaths, ICU admission and stringency, ICU admission and resident are highly positive correlated 3.ICU admission and temperature, ICU admission and transit are highly negative correlated

for ICU admission: fit var model including all variables, comparing to the var model without humidity, precipitation and wind speed.

new deaths highly positive correlated to stringency_index, and residential. Negative correlated to temperature and public transition.

strigency_index increases, residential increases, transition decreases. (temperature has opposite relation)

transit and residential as highly negative correlated.

Plots

plot(data$new_cases) # 2022-02-07 has 380399 cases, (outlier, remove and graph again) volatity

plot(data$new_cases[-403])

plot(data$new_deaths)

# more deaths at the beginning 
plot(data$icu_patients)

plot(data$hosp_patients)

plot(data$stringency_index)

plot(data$temp)

plot(data$humidity)

plot(data$precip)

plot(data$windspeed)

plot(data$transit_stations)

plot(data$residential)

# ICU, hosp, stringency, residential trends are similar, transition has opposite trend.

stringency 会导致lockdown, residential的变化和stringency相似, 从而影响hosp admission。

summer low COVID, winter high COVID 湿度看着和hosp admission, icu走势有点像, 风速和降雨量看不出来。

distribution

hist(data$icu_patients)
hist(data$hosp_patients)
hist(data$new_cases)
hist(data$new_deaths)
hist(data$stringency_index)
hist(data$temp)
hist(data$humidity)
hist(data$precip)
hist(data$windspeed)
hist(data$transit_stations)
hist(data$residential)

heteroscedasticity

lm1=lm(hosp_patients~., data=data[,c(2,3,5,6,7,8,9,10,11,12)])
summary(lm1)
# number of new deaths, temperature, humidity, and residential have significant impact on hospital admission.
# new deaths increases, more hospital admissions
# temperature and humidity get higher, the less hospital admission
# hospital admission increases as residential increases.

plot(lm1)
# heteroscedasticity detected, maybe garch model can be used in time series model (further hetero test need to be done)

如果将温度, 湿度, 风速降雨量等调整为categorical数据, 是否能观察出相关性

data_cat=data
data_cat$temp_cat_int <- discretize(data_cat$temp, method="interval", breaks=4)
data_cat$temp_cat_fre <- discretize(data_cat$temp, method="frequency", breaks=4)
data_cat$temp_cat_clu <- discretize(data_cat$temp, method="cluster", breaks=4) #KNN
summary(data_cat$temp_cat_int)
summary(data_cat$temp_cat_fre)
summary(data_cat$temp_cat_clu)
# based on discretization, we used 3 different method to categorize the temperature into 5 level, select the result from KNN model
# [-6,4): cold
# [4,9):cool
# [9,14): warm
# [14,23]: hot

data_cat$wind_cat_int <- discretize(data_cat$windspeed, method="interval", breaks=4)
data_cat$wind_cat_fre <- discretize(data_cat$windspeed, method="frequency", breaks=4)
data_cat$wind_cat_clu <- discretize(data_cat$windspeed, method="cluster", breaks=4) #KNN
summary(data_cat$wind_cat_int)
summary(data_cat$wind_cat_fre)
summary(data_cat$wind_cat_clu)
#[7.6,19.5):low
#[19.5,29): mid
#[29,43.4): strong
#[43.4,82.5]: very strong

data_cat$pre_cat_int <- discretize(data_cat$precip, method="interval", breaks=4)
data_cat$pre_cat_fre <- discretize(data_cat$precip, method="frequency", breaks=4)
data_cat$pre_cat_clu <- discretize(data_cat$precip, method="cluster", breaks=4) #KNN
summary(data_cat$pre_cat_int)
summary(data_cat$pre_cat_fre)
summary(data_cat$pre_cat_clu)

data_cat$hum_cat_int <- discretize(data_cat$humidity, method="interval", breaks=4)
data_cat$hum_cat_fre <- discretize(data_cat$humidity, method="frequency", breaks=4)
data_cat$hum_cat_clu <- discretize(data_cat$humidity, method="cluster", breaks=4) #KNN
summary(data_cat$hum_cat_int)
summary(data_cat$hum_cat_fre)
summary(data_cat$hum_cat_clu)
#[46.6,68.4): level 1
#[68.4,79.8): level 2
#[79.8,88.3): level 3
#[88.3,98.8]: level 4

convert the numerical variables into categorical variables

data_cat$temp_cat=ifelse(data$temp<4, 'cold', 
                     ifelse(data$temp<9, 'cool',
                            ifelse(data$temp<14, 'warm', 'hot')))
data_cat$wind_cat=ifelse(data$windspeed<19.5, 'low', 
                     ifelse(data$windspeed<29, 'mid',
                            ifelse(data$windspeed<43.5, 'high', 'strong')))

plot the categorical variables vs number of hospital patients

fit a lm using categorical data

lm2=lm(hosp_patients~., data=data_cat[, c(2,3,5,6,11,12, 25, 26)])
summary(lm2)
# when temperature is higher than 9 degrees, it has an effect on the COVID hospital admission.
# wind does not have an impact on hospital admission
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQpgYGB7cn0KbGlicmFyeShwc3ljaCkKbGlicmFyeShjb3JycGxvdCkKbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoc3RyaW5ncikKbGlicmFyeShiYXNlKQpsaWJyYXJ5KHNmKQpsaWJyYXJ5KHNjYWxlcykKbGlicmFyeSh2YXJzKQpsaWJyYXJ5KGxhdHRpY2UpCmxpYnJhcnkodXJjYSkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KE1BU1MpCmxpYnJhcnkoaGF2ZW4pCmxpYnJhcnkoam9pbmVSKQpsaWJyYXJ5KHBST0MpCmxpYnJhcnkoTUVTUykKbGlicmFyeShhcnVsZXMpCmBgYAoKIyByZWFkIGZpbGUKYGBge3J9CmRhdGE9cmVhZC5jc3YoJ25ld19kYXRhLmNzdicpCmBgYAoKIyBEYXRhIGV4cGxvcmF0aW9uCmBgYHtyfQpkZXNjcmliZShkYXRhKQpgYGAKVGhlcmUgYXJlIDEyIHZhcmlhYmxlcyBpbiB0aGUgZGF0YSB3aXRoIDQ4NSBvYnNlcnZhdGlvbnMuIEluY2x1ZGluZyAxIGRhdGUgdmFyaWFibGUsIDIgcmVzcG9uc2UgdmFyaWFibGVzLCBhbmQgOSBwcmVkaWN0b3JzLiBBbGwgdmFyaWFibGVzIGFyZSBudW1lcmljIHR5cGUgZXhjZXB0IHZhcmlhbGUgJ2RhdGUnLiAKMS4gZGF0ZQoyLiBuZXdfY2FzZXM6IHRoZSBkYWlseSBuZXcgY29uZmlybWVkIENPVklEIGNhc2VzIGluIE5ldGhlcmxhbmRzCjMuIG5ld19kZWF0aHM6IHRoZSBkYWlseSBuZXcgZGVhdGhzIG9mIENPVklEIHBhdGllbnRzIGluIE5ldGhlcmxhbmRzCjQuIElDVV9wYXRpZW50czogdGhlIENPVklEIHBhdGllbnRzIGFkbWl0dGVkIHRvIElDVSBwZXIgZGF5IGluIGhvc3BpdGFsCjUuIEhvc3BfcGF0aWVudHM6IHRoZSBDT1ZJRCBwYXRpZW50cyBhZG1pdHRlZCB0byBob3NwdGlhbCBwZXIgZGF5CjYuIHN0cmluZ2VuY3lfaW5kZXg6CjcuIHRlbXA6IGRhaWx5IHRlbXBlcmF0dXJlCjguIGh1bWlkaXR5OiBkYWlseSBodW1pZGl0eQo5LiBwcmVjaXA6IHRoZSBhbW91bnQgb2YgcmFpbnMgcGVyIGRheQoxMC4gd2luZHNwZWVkOiBkYWlseSB3aW5kc3BlZWQKMTEuIHRyYW5zaXRfc3RhdGlvbnM6CjEyOiByZXNpZGVudGlhbDoKCumXrumimO+8miB0cmFuc2l0IOmDveaYr+i0n+aVsO+8jOmcgOS4jemcgOimgeiwg+aVtOS7jjDlvIDlp4sg5Yik5pat5Lq65Lus5LmY5Z2Q5Lqk6YCa55qE5Y+Y5YyWCgoKIyMgY2hlY2tpbmcgbWlzc2luZ25lc3MKYGBge3J9CnN1bShpcy5uYShkYXRhKSkKc3VtKGlzLm5hKGRhdGEkaWN1X3BhdGllbnRzKSkKc3VtKGlzLm5hKGRhdGEkaG9zcF9wYXRpZW50cykpCmBgYApUaGVyZSBhcmUgMTggbWlzc2luZyB2YWx1ZXMgaW4gdGhlIGRhdGEsIGxvY2F0ZSBpbiBJQ1UgcGF0aWVudHMgYW5kIEhvc3BpdGFsIHBhdGllbnRzIGNvbHVtbnMuIChUaGUgZ292ZXJubWVudCB3ZWJzaXRlIGRvZXMgbm90IGhhdmUgQ09WSUQgcmVjb3JkcyBmb3Igc29tZSBkYXlzIGR1cmluZyAyMDIxLSAyMDIyKQoKIyMgY29ycmVsYXRpb25zIApgYGB7cn0KcGFpcnMoZGF0YVssIDI6Nl0pCgpjb3IoZGF0YVssIDI6MTJdKQoKY29ycnBsb3QoY29yKGRhdGFbLCAyOjEyXSksIG1ldGhvZCA9ICJjaXJjbGUiLAogICAgICAgIHRpdGxlID0gIm1ldGhvZCA9ICdjaXJjbGUnIikgCmBgYAoKRm9yIGhvc3BpdGFsIGFkbWlzc2lvbgoxLmhvc3BpdGFsIGFkbWlzc2lvbiBhbmQgaHVtaWRpdHksIGhvc3BpdGFsIGFkbWlzc2lvbiBhbmQgcHJlY2lwaXRhdGlvbiBoYXZlIHNtYWxsIGNvcnJlbGF0aW9uIGxlc3MgdGhhbiAwLjEKMi5ob3NwaXRhbCBhZG1pc3Npb24gYW5kIG5ldyBkZWF0aHMsIGhvc3BpdGFsIGFkbWlzc2lvbiBhbmQgcmVzaWRlbnQgYXJlIGhpZ2hseSBwb3NpdGl2ZSBjb3JyZWxhdGVkIAozLmhvc3BpdGFsIGFkbWlzc2lvbiBhbmQgdGVtcGVyYXR1cmUsIGhvc3BpdGFsIGFkbWlzc2lvbiBhbmQgdHJhbnNpdCBhcmUgaGlnaGx5IG5lZ2F0aXZlIGNvcnJlbGF0ZWQKCmZvciBob3NwaXRhbCBhZG1pc3Npb246IGZpdCB2YXIgbW9kZWwgaW5jbHVkaW5nIGFsbCB2YXJpYWJsZXMsIGNvbXBhcmluZyB0byB0aGUgdmFyIG1vZGVsIHdpdGhvdXQgaHVtaWRpdHksIHByZWNpcGl0YXRpb24sIGFuZCB3aW5kIHNwZWVkLgoKCgpGb3IgSUNVIGFkbWlzc2lvbgoxLklDVSBhZG1pc3Npb24gYW5kIGh1bWlkaXR5LCBJQ1UgYWRtaXNzaW9uIGFuZCBwcmVjaXBpdGF0aW9uLCBJQ1UgYW5kIHdpbmQgc3BlZWQgaGF2ZSBzbWFsbCBjb3JyZWxhdGlvbiBsZXNzIHRoYW4gMC4xLgoyLklDVSBhZG1pc3Npb24gYW5kIG5ldyBkZWF0aHMsIElDVSBhZG1pc3Npb24gYW5kIHN0cmluZ2VuY3ksIElDVSBhZG1pc3Npb24gYW5kIHJlc2lkZW50IGFyZSBoaWdobHkgcG9zaXRpdmUgY29ycmVsYXRlZCAKMy5JQ1UgYWRtaXNzaW9uIGFuZCB0ZW1wZXJhdHVyZSwgSUNVIGFkbWlzc2lvbiBhbmQgdHJhbnNpdCBhcmUgaGlnaGx5IG5lZ2F0aXZlIGNvcnJlbGF0ZWQKCmZvciBJQ1UgYWRtaXNzaW9uOiBmaXQgdmFyIG1vZGVsIGluY2x1ZGluZyBhbGwgdmFyaWFibGVzLCBjb21wYXJpbmcgdG8gdGhlIHZhciBtb2RlbCB3aXRob3V0IGh1bWlkaXR5LCBwcmVjaXBpdGF0aW9uIGFuZCB3aW5kIHNwZWVkLgoKCm5ldyBkZWF0aHMgaGlnaGx5IHBvc2l0aXZlIGNvcnJlbGF0ZWQgdG8gc3RyaW5nZW5jeV9pbmRleCwgYW5kIHJlc2lkZW50aWFsLiBOZWdhdGl2ZSBjb3JyZWxhdGVkIHRvIHRlbXBlcmF0dXJlIGFuZCBwdWJsaWMgdHJhbnNpdGlvbi4KCnN0cmlnZW5jeV9pbmRleCBpbmNyZWFzZXMsIHJlc2lkZW50aWFsIGluY3JlYXNlcywgdHJhbnNpdGlvbiBkZWNyZWFzZXMuICh0ZW1wZXJhdHVyZSBoYXMgb3Bwb3NpdGUgcmVsYXRpb24pCgp0cmFuc2l0IGFuZCByZXNpZGVudGlhbCBhcyBoaWdobHkgbmVnYXRpdmUgY29ycmVsYXRlZC4KCiMgUGxvdHMKYGBge3J9CnBsb3QoZGF0YSRuZXdfY2FzZXMpICMgMjAyMi0wMi0wNyBoYXMgMzgwMzk5IGNhc2VzLCAob3V0bGllciwgcmVtb3ZlIGFuZCBncmFwaCBhZ2Fpbikgdm9sYXRpdHkKcGxvdChkYXRhJG5ld19jYXNlc1stNDAzXSkKcGxvdChkYXRhJG5ld19kZWF0aHMpCiMgbW9yZSBkZWF0aHMgYXQgdGhlIGJlZ2lubmluZyAKcGxvdChkYXRhJGljdV9wYXRpZW50cykKcGxvdChkYXRhJGhvc3BfcGF0aWVudHMpCnBsb3QoZGF0YSRzdHJpbmdlbmN5X2luZGV4KQpwbG90KGRhdGEkdGVtcCkKcGxvdChkYXRhJGh1bWlkaXR5KQpwbG90KGRhdGEkcHJlY2lwKQpwbG90KGRhdGEkd2luZHNwZWVkKQpwbG90KGRhdGEkdHJhbnNpdF9zdGF0aW9ucykKcGxvdChkYXRhJHJlc2lkZW50aWFsKQojIElDVSwgaG9zcCwgc3RyaW5nZW5jeSwgcmVzaWRlbnRpYWwgdHJlbmRzIGFyZSBzaW1pbGFyLCB0cmFuc2l0aW9uIGhhcyBvcHBvc2l0ZSB0cmVuZC4KCmBgYAoKc3RyaW5nZW5jeSDkvJrlr7zoh7Rsb2NrZG93bu+8jCByZXNpZGVudGlhbOeahOWPmOWMluWSjHN0cmluZ2VuY3nnm7jkvLzvvIwg5LuO6ICM5b2x5ZONaG9zcCBhZG1pc3Npb27jgIIKCgoKc3VtbWVyIGxvdyBDT1ZJRCwgd2ludGVyIGhpZ2ggQ09WSUQK5rm/5bqm55yL552A5ZKMaG9zcCBhZG1pc3Npb27vvIwgaWN16LWw5Yq/5pyJ54K55YOP77yMIOmjjumAn+WSjOmZjembqOmHj+eci+S4jeWHuuadpeOAggoKCiMgZGlzdHJpYnV0aW9uCmBgYHtyfQpoaXN0KGRhdGEkaWN1X3BhdGllbnRzKQpoaXN0KGRhdGEkaG9zcF9wYXRpZW50cykKaGlzdChkYXRhJG5ld19jYXNlcykKaGlzdChkYXRhJG5ld19kZWF0aHMpCmhpc3QoZGF0YSRzdHJpbmdlbmN5X2luZGV4KQpoaXN0KGRhdGEkdGVtcCkKaGlzdChkYXRhJGh1bWlkaXR5KQpoaXN0KGRhdGEkcHJlY2lwKQpoaXN0KGRhdGEkd2luZHNwZWVkKQpoaXN0KGRhdGEkdHJhbnNpdF9zdGF0aW9ucykKaGlzdChkYXRhJHJlc2lkZW50aWFsKQpgYGAKCiMgaGV0ZXJvc2NlZGFzdGljaXR5IApgYGB7cn0KbG0xPWxtKGhvc3BfcGF0aWVudHN+LiwgZGF0YT1kYXRhWyxjKDIsMyw1LDYsNyw4LDksMTAsMTEsMTIpXSkKc3VtbWFyeShsbTEpCiMgbnVtYmVyIG9mIG5ldyBkZWF0aHMsIHRlbXBlcmF0dXJlLCBodW1pZGl0eSwgYW5kIHJlc2lkZW50aWFsIGhhdmUgc2lnbmlmaWNhbnQgaW1wYWN0IG9uIGhvc3BpdGFsIGFkbWlzc2lvbi4KIyBuZXcgZGVhdGhzIGluY3JlYXNlcywgbW9yZSBob3NwaXRhbCBhZG1pc3Npb25zCiMgdGVtcGVyYXR1cmUgYW5kIGh1bWlkaXR5IGdldCBoaWdoZXIsIHRoZSBsZXNzIGhvc3BpdGFsIGFkbWlzc2lvbgojIGhvc3BpdGFsIGFkbWlzc2lvbiBpbmNyZWFzZXMgYXMgcmVzaWRlbnRpYWwgaW5jcmVhc2VzLgoKcGxvdChsbTEpCiMgaGV0ZXJvc2NlZGFzdGljaXR5IGRldGVjdGVkLCBtYXliZSBnYXJjaCBtb2RlbCBjYW4gYmUgdXNlZCBpbiB0aW1lIHNlcmllcyBtb2RlbCAoZnVydGhlciBoZXRlcm8gdGVzdCBuZWVkIHRvIGJlIGRvbmUpCmBgYAoKCiMg5aaC5p6c5bCG5rip5bqm77yMIOa5v+W6pu+8jCDpo47pgJ/pmY3pm6jph4/nrYnosIPmlbTkuLpjYXRlZ29yaWNhbOaVsOaNru+8jCDmmK/lkKbog73op4Llr5/lh7rnm7jlhbPmgKcKYGBge3J9CmRhdGFfY2F0PWRhdGEKZGF0YV9jYXQkdGVtcF9jYXRfaW50IDwtIGRpc2NyZXRpemUoZGF0YV9jYXQkdGVtcCwgbWV0aG9kPSJpbnRlcnZhbCIsIGJyZWFrcz00KQpkYXRhX2NhdCR0ZW1wX2NhdF9mcmUgPC0gZGlzY3JldGl6ZShkYXRhX2NhdCR0ZW1wLCBtZXRob2Q9ImZyZXF1ZW5jeSIsIGJyZWFrcz00KQpkYXRhX2NhdCR0ZW1wX2NhdF9jbHUgPC0gZGlzY3JldGl6ZShkYXRhX2NhdCR0ZW1wLCBtZXRob2Q9ImNsdXN0ZXIiLCBicmVha3M9NCkgI0tOTgpzdW1tYXJ5KGRhdGFfY2F0JHRlbXBfY2F0X2ludCkKc3VtbWFyeShkYXRhX2NhdCR0ZW1wX2NhdF9mcmUpCnN1bW1hcnkoZGF0YV9jYXQkdGVtcF9jYXRfY2x1KQojIGJhc2VkIG9uIGRpc2NyZXRpemF0aW9uLCB3ZSB1c2VkIDMgZGlmZmVyZW50IG1ldGhvZCB0byBjYXRlZ29yaXplIHRoZSB0ZW1wZXJhdHVyZSBpbnRvIDUgbGV2ZWwsIHNlbGVjdCB0aGUgcmVzdWx0IGZyb20gS05OIG1vZGVsCiMgWy02LDQpOiBjb2xkCiMgWzQsOSnvvJpjb29sCiMgWzksMTQp77yaIHdhcm0KIyBbMTQsMjNd77yaIGhvdAoKZGF0YV9jYXQkd2luZF9jYXRfaW50IDwtIGRpc2NyZXRpemUoZGF0YV9jYXQkd2luZHNwZWVkLCBtZXRob2Q9ImludGVydmFsIiwgYnJlYWtzPTQpCmRhdGFfY2F0JHdpbmRfY2F0X2ZyZSA8LSBkaXNjcmV0aXplKGRhdGFfY2F0JHdpbmRzcGVlZCwgbWV0aG9kPSJmcmVxdWVuY3kiLCBicmVha3M9NCkKZGF0YV9jYXQkd2luZF9jYXRfY2x1IDwtIGRpc2NyZXRpemUoZGF0YV9jYXQkd2luZHNwZWVkLCBtZXRob2Q9ImNsdXN0ZXIiLCBicmVha3M9NCkgI0tOTgpzdW1tYXJ5KGRhdGFfY2F0JHdpbmRfY2F0X2ludCkKc3VtbWFyeShkYXRhX2NhdCR3aW5kX2NhdF9mcmUpCnN1bW1hcnkoZGF0YV9jYXQkd2luZF9jYXRfY2x1KQojWzcuNiwxOS41KTpsb3cKI1sxOS41LDI5KTogbWlkCiNbMjksNDMuNCk6IHN0cm9uZwojWzQzLjQsODIuNV06IHZlcnkgc3Ryb25nCgpkYXRhX2NhdCRwcmVfY2F0X2ludCA8LSBkaXNjcmV0aXplKGRhdGFfY2F0JHByZWNpcCwgbWV0aG9kPSJpbnRlcnZhbCIsIGJyZWFrcz00KQpkYXRhX2NhdCRwcmVfY2F0X2ZyZSA8LSBkaXNjcmV0aXplKGRhdGFfY2F0JHByZWNpcCwgbWV0aG9kPSJmcmVxdWVuY3kiLCBicmVha3M9NCkKZGF0YV9jYXQkcHJlX2NhdF9jbHUgPC0gZGlzY3JldGl6ZShkYXRhX2NhdCRwcmVjaXAsIG1ldGhvZD0iY2x1c3RlciIsIGJyZWFrcz00KSAjS05OCnN1bW1hcnkoZGF0YV9jYXQkcHJlX2NhdF9pbnQpCnN1bW1hcnkoZGF0YV9jYXQkcHJlX2NhdF9mcmUpCnN1bW1hcnkoZGF0YV9jYXQkcHJlX2NhdF9jbHUpCgpkYXRhX2NhdCRodW1fY2F0X2ludCA8LSBkaXNjcmV0aXplKGRhdGFfY2F0JGh1bWlkaXR5LCBtZXRob2Q9ImludGVydmFsIiwgYnJlYWtzPTQpCmRhdGFfY2F0JGh1bV9jYXRfZnJlIDwtIGRpc2NyZXRpemUoZGF0YV9jYXQkaHVtaWRpdHksIG1ldGhvZD0iZnJlcXVlbmN5IiwgYnJlYWtzPTQpCmRhdGFfY2F0JGh1bV9jYXRfY2x1IDwtIGRpc2NyZXRpemUoZGF0YV9jYXQkaHVtaWRpdHksIG1ldGhvZD0iY2x1c3RlciIsIGJyZWFrcz00KSAjS05OCnN1bW1hcnkoZGF0YV9jYXQkaHVtX2NhdF9pbnQpCnN1bW1hcnkoZGF0YV9jYXQkaHVtX2NhdF9mcmUpCnN1bW1hcnkoZGF0YV9jYXQkaHVtX2NhdF9jbHUpCiNbNDYuNiw2OC40KTogbGV2ZWwgMQojWzY4LjQsNzkuOCk6IGxldmVsIDIKI1s3OS44LDg4LjMpOiBsZXZlbCAzCiNbODguMyw5OC44XTogbGV2ZWwgNApgYGAKCiMgY29udmVydCB0aGUgbnVtZXJpY2FsIHZhcmlhYmxlcyBpbnRvIGNhdGVnb3JpY2FsIHZhcmlhYmxlcwpgYGB7cn0KZGF0YV9jYXQkdGVtcF9jYXQ9aWZlbHNlKGRhdGEkdGVtcDw0LCAnY29sZCcsIAogICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGF0YSR0ZW1wPDksICdjb29sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShkYXRhJHRlbXA8MTQsICd3YXJtJywgJ2hvdCcpKSkKZGF0YV9jYXQkd2luZF9jYXQ9aWZlbHNlKGRhdGEkd2luZHNwZWVkPDE5LjUsICdsb3cnLCAKICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGRhdGEkd2luZHNwZWVkPDI5LCAnbWlkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShkYXRhJHdpbmRzcGVlZDw0My41LCAnaGlnaCcsICdzdHJvbmcnKSkpCmBgYAoKIyBwbG90IHRoZSBjYXRlZ29yaWNhbCB2YXJpYWJsZXMgdnMgbnVtYmVyIG9mIGhvc3BpdGFsIHBhdGllbnRzCmBgYHtyfQpnZ3Bsb3QoZGF0YV9jYXQsIGFlcyh4ID0gc2VxKDEsIDQ4NSwgMSksCiAgICAgICAgICAgICAgICAgICAgIHkgPSBob3NwX3BhdGllbnRzLCAKICAgICAgICAgICAgICAgICAgICAgZ3JvdXA9dGVtcF9jYXQsIAogICAgICAgICAgICAgICAgICAgICBjb2xvcj10ZW1wX2NhdCkpICtnZW9tX3BvaW50KCkgK3hsYWIoJ2RhdGUnKQojIGNsZWFybHkgaG90IHRlbXBlcmF0dXJlIHJlc3VsdHMgbG93ZXIgQ09WSUQgaG9zcGl0YWwgcGF0aWVudHMKCmdncGxvdChkYXRhX2NhdCwgYWVzKHggPSBzZXEoMSwgNDg1LCAxKSwKICAgICAgICAgICAgICAgICAgICAgeSA9IGhvc3BfcGF0aWVudHMsIAogICAgICAgICAgICAgICAgICAgICBncm91cD13aW5kX2NhdCwgCiAgICAgICAgICAgICAgICAgICAgIGNvbG9yPXdpbmRfY2F0KSkgK2dlb21fcG9pbnQoKSAreGxhYignZGF0ZScpCiMgbm8gY2xlYXJseSB0cmVuZApgYGAKCiMgZml0IGEgbG0gdXNpbmcgY2F0ZWdvcmljYWwgZGF0YQpgYGB7cn0KbG0yPWxtKGhvc3BfcGF0aWVudHN+LiwgZGF0YT1kYXRhX2NhdFssIGMoMiwzLDUsNiwxMSwxMiwgMjUsIDI2KV0pCnN1bW1hcnkobG0yKQojIHdoZW4gdGVtcGVyYXR1cmUgaXMgaGlnaGVyIHRoYW4gOSBkZWdyZWVzLCBpdCBoYXMgYW4gZWZmZWN0IG9uIHRoZSBDT1ZJRCBob3NwaXRhbCBhZG1pc3Npb24uCiMgd2luZCBkb2VzIG5vdCBoYXZlIGFuIGltcGFjdCBvbiBob3NwaXRhbCBhZG1pc3Npb24KYGBgCgo=